#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

int ticket = 100; // 1-100号的票
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

void *buyTicket(void *arg)
{
    char *name = static_cast<char *>(arg);
    while (true)
    {
        pthread_mutex_lock(&lock);
        if (ticket > 0)
        {
            usleep(100); // 模拟抢票耗时,睡眠0.1ms
            printf("%s buy ticket:%d\n", name, ticket);
            --ticket;
            pthread_mutex_unlock(&lock);
        }
        else
        {
            pthread_mutex_unlock(&lock);
            break;
        }
    }

    return nullptr;
}

// 如果这样写，抢到锁后，就一直循环抢票了，其他线程都没有锁，抢不到票
// void* buyTicket(void* arg)
// {
//     char* name = static_cast<char*>(arg);
//     pthread_mutex_lock(&lock);
//     while(ticket > 0)
//     {
//         usleep(100); // 睡眠0.1ms
//         printf("%s buy ticket:%d\n",name,ticket);
//         --ticket;
//     }
//     pthread_mutex_unlock(&lock);

//     return nullptr;
// }

// 如果这样写，还是会抢票混乱，关键是抢到锁后要再判断
// void* buyTicket(void* arg)
// {
//     char* name = static_cast<char*>(arg);
//     while(ticket > 0)
//     {
//         pthread_mutex_lock(&lock);

//         usleep(100); // 睡眠0.1ms
//         printf("%s buy ticket:%d\n",name,ticket);
//         --ticket;

//         pthread_mutex_unlock(&lock);
//     }

//     return nullptr;
// }

int main()
{
    pthread_t tid1, tid2, tid3;
    pthread_create(&tid1, nullptr, buyTicket, (void *)"tid1");
    pthread_create(&tid2, nullptr, buyTicket, (void *)"tid2");
    pthread_create(&tid3, nullptr, buyTicket, (void *)"tid3");

    pthread_join(tid1, nullptr);
    pthread_join(tid2, nullptr);
    pthread_join(tid3, nullptr);

    return 0;
}